import { IsString, IsOptional, IsBoolean, IsEnum, IsInt, Length, IsNotEmpty } from 'class-validator';
import { MenuType } from '@/generated/prisma/client';
import { PaginationDto } from '@dtos/pagination.dto';

export class CreateMenuDto {
  @IsString({ message: '菜单 name 必须是字符串' })
  @IsNotEmpty({ message: '菜单 name 不能为空' })
  @Length(1, 50, { message: '菜单 name 长度为 1-50 位' })
  name!: string;

  @IsEnum(MenuType, { message: '菜单类型必须是 directory 或 menu' })
  @IsNotEmpty({ message: '菜单类型不能为空' })
  type!: MenuType;

  @IsInt({ message: '父级菜单 ID 必须是整数' })
  @IsOptional()
  parentId?: number | null;

  @IsString({ message: '标题必须是字符串' })
  @IsNotEmpty({ message: '标题不能为空' })
  @Length(1, 50, { message: '标题长度为 1-50 位' })
  title!: string;

  @IsString({ message: '组件路径必须是字符串' })
  @IsNotEmpty({ message: '组件路径不能为空' })
  @Length(1, 50, { message: '组件路径长度为 1-50 位' })
  component!: string;

  @IsString({ message: '图标必须是字符串' })
  @IsOptional()
  @Length(0, 50, { message: '图标长度不能超过 50 位' })
  icon?: string;

  @IsString({ message: '路由路径必须是字符串' })
  @IsNotEmpty({ message: '路由路径不能为空' })
  @Length(1, 50, { message: '路由路径长度为 1-50 位' })
  path!: string;

  @IsString({ message: '高亮菜单必须是字符串' })
  @IsOptional()
  @Length(0, 50, { message: '高亮菜单长度不能超过 50 位' })
  activeMenu?: string;

  @IsBoolean({ message: '状态必须是布尔值' })
  @IsOptional()
  status?: boolean = true;

  @IsBoolean({ message: '隐藏必须是布尔值' })
  @IsOptional()
  hidden?: boolean = false;

  @IsBoolean({ message: '总是显示必须是布尔值' })
  @IsOptional()
  alwaysShow?: boolean = false;

  @IsBoolean({ message: '无缓存必须是布尔值' })
  @IsOptional()
  noCache?: boolean = false;

  @IsBoolean({ message: '面包屑必须是布尔值' })
  @IsOptional()
  breadcrumb?: boolean = true;

  @IsBoolean({ message: '固定标签必须是布尔值' })
  @IsOptional()
  affix?: boolean = false;

  @IsBoolean({ message: '无标签页必须是布尔值' })
  @IsOptional()
  noTagsView?: boolean = false;

  @IsBoolean({ message: '可跳转必须是布尔值' })
  @IsOptional()
  canTo?: boolean = false;
}

export class UpdateMenuDto {
  @IsString({ message: '菜单 name 必须是字符串' })
  @IsOptional()
  @Length(1, 50, { message: '菜单 name 长度为 1-50 位' })
  name?: string;

  @IsEnum(MenuType, { message: '菜单类型必须是 directory 或 menu' })
  @IsOptional()
  type?: MenuType;

  @IsInt({ message: '父级菜单 ID 必须是整数' })
  @IsOptional()
  parentId?: number;

  @IsString({ message: '标题必须是字符串' })
  @IsOptional()
  @Length(1, 50, { message: '标题长度为 1-50 位' })
  title?: string;

  @IsString({ message: '组件路径必须是字符串' })
  @IsOptional()
  @Length(1, 50, { message: '组件路径长度为 1-50 位' })
  component?: string;

  @IsString({ message: '图标必须是字符串' })
  @IsOptional()
  @Length(0, 50, { message: '图标长度不能超过 50 位' })
  icon?: string;

  @IsString({ message: '路由路径必须是字符串' })
  @IsOptional()
  @Length(1, 50, { message: '路由路径长度为 1-50 位' })
  path?: string;

  @IsString({ message: '高亮菜单必须是字符串' })
  @IsOptional()
  @Length(0, 50, { message: '高亮菜单长度不能超过 50 位' })
  activeMenu?: string;

  @IsOptional()
  permission?: any;

  @IsBoolean({ message: '状态必须是布尔值' })
  @IsOptional()
  status?: boolean;

  @IsBoolean({ message: '隐藏必须是布尔值' })
  @IsOptional()
  hidden?: boolean;

  @IsBoolean({ message: '总是显示必须是布尔值' })
  @IsOptional()
  alwaysShow?: boolean;

  @IsBoolean({ message: '无缓存必须是布尔值' })
  @IsOptional()
  noCache?: boolean;

  @IsBoolean({ message: '面包屑必须是布尔值' })
  @IsOptional()
  breadcrumb?: boolean;

  @IsBoolean({ message: '固定标签必须是布尔值' })
  @IsOptional()
  affix?: boolean;

  @IsBoolean({ message: '无标签页必须是布尔值' })
  @IsOptional()
  noTagsView?: boolean;

  @IsBoolean({ message: '可跳转必须是布尔值' })
  @IsOptional()
  canTo?: boolean;
}

export class MenuPageDto extends PaginationDto {
  @IsString({ message: '菜单 name 模糊搜索' })
  @Length(0, 50, { message: '菜单 name 长度为 0-50 位' })
  @IsOptional()
  name?: string;

  @IsString({ message: '标题模糊搜索' })
  @Length(0, 50, { message: '标题长度不能超过 50 位' })
  @IsOptional()
  title?: string;

  @IsBoolean({ message: '状态必须是布尔值' })
  @IsOptional()
  status?: boolean;
}
